#include <thread>

#include "hot.hpp"
#include "server.hpp"

// void FileUtilTest(const std::string &filename)
// {
//     // cloud::FileUtil fu(filename);

//     // std::cout << fu.FileSize() << std::endl;
//     // std::cout << fu.LastMTime() << std::endl;
//     // std::cout << fu.LastATime() << std::endl;
//     // std::cout << fu.FileName() << std::endl;

//     // std::string body;
//     // fu.GetContent(&body);//获取文件内容到body中

//     // cloud::FileUtil ufu("./test.txt"); //当前目录下存在一个./text.txt
//     // ufu.SetContent(body); //将body内容写入到./text.txt中

//     // std::string packname = filename + ".lz"; //.lz压缩包后缀
//     // cloud::FileUtil fu(filename);
//     // // 压缩文件
//     // fu.Compress(packname);

//     // cloud::FileUtil pfu(packname);
//     // // 解压后的文件内容放入到 test.txt
//     // pfu.UnCompress("./test.txt");

//     // cloud::FileUtil fu(filename);
//     // fu.CreateDirectory();

//     // std::vector<std::string> array;
//     // fu.ScanDirectory(&array);

//     // // 遍历目录文件
//     // for (auto &e : array)
//     // {
//     //     std::cout << e << std::endl;
//     // }
// }

// void JsonUtilTest()
// {
//     const char *name = "张三";
//     int age = 18;
//     float score[] = {90.5, 77, 100};

//     Json::Value root;
//     root["姓名"] = name;
//     root["年龄"] = age;
//     root["成绩"].append(score[0]);
//     root["成绩"].append(score[1]);
//     root["成绩"].append(score[2]);

//     std::string json_str;
//     cloud::JsonUtil::Serialize(root, &json_str); // 序列化操作
//     std::cout << json_str << std::endl;

//     Json::Value val;
//     cloud::JsonUtil::UnSerialize(json_str, &val); // 反序列化操作
//     std::cout << val["姓名"].asString() << std::endl;
//     std::cout << val["年龄"].asInt() << std::endl;

//     for (auto &e : val["成绩"])
//     {
//         std::cout << e << std::endl;
//     }
// }

// void ConfigTest()
// {
//     // 实例化单例
//     cloud::Config *config = cloud::Config::GetInstance();

//     std::cout << config->GetHotTime() << std::endl;
//     std::cout << config->GetServerPort() << std::endl;
//     std::cout << config->GetServerIP() << std::endl;
//     std::cout << config->GetDownloadPrefix() << std::endl;
//     std::cout << config->GetPackFileSuffix() << std::endl;
//     std::cout << config->GetBackDir() << std::endl;
//     std::cout << config->GetPackDir() << std::endl;
//     std::cout << config->GetBackupFile() << std::endl;
// }

void PrintBackUpInfo(const cloud::BackupInfo &info)
{
    std::cout << info.pack_flag << std::endl;
    std::cout << info.fsize << std::endl;
    std::cout << info.mtime << std::endl;
    std::cout << info.atime << std::endl;
    std::cout << info.real_path << std::endl;
    std::cout << info.pack_path << std::endl;
    std::cout << info.url << std::endl;
}

void DataTest(const std::string &filename)
{
    cloud::BackupInfo info;
    info.NewBackupInfo(filename); // 初始化
    cloud::DataManager data;

    std::cout << "------------------Insert------------------------\n";
    data.Insert(info); // 将备份文件数据信息进行插入

    cloud::BackupInfo tmp;
    data.GetOneByUrl("/download/bundle.h", &tmp); // 查看下载目录下是否存在bundle.h文件
    // 打印对应的数据信息
    PrintBackUpInfo(tmp);

    std::cout << "------------------UpDate------------------------\n";
    // 修改刚刚插入数据的内容
    info.pack_flag = true;
    data.UpDate(info);
    std::vector<cloud::BackupInfo> array;
    data.GetAll(&array);
    for (auto &e : array)
    {
        PrintBackUpInfo(e);
    }

    std::cout << "------------------GetOneByRealPath------------------------\n";
    data.GetOneByRealPath(filename, &tmp);
    PrintBackUpInfo(tmp);
}

cloud::DataManager* _data;

void HotTask()
{

    cloud::HotManager hot;
    //进行热点文件检测
    hot.RunModule();
}

void ServerTask()
{
    cloud::server srv;
    //启动服务器进行业务处理
    srv.RunModule();
}


int main(int argc, char *argv[])
{
    _data = new cloud::DataManager();

    //热点模块任务
    std::thread thread_Hot(HotTask);
    //业务处理模块
    std::thread thread_Server(ServerTask);

    //等待线程
    thread_Hot.join();
    thread_Server.join();

    // FileUtilText(argv[1]);
    // JsonUtilTest();
    // ConfigTest();
    // DataTest(argv[1]);
    // HotTest();
    // ServerTest();

    return 0;
}